// REVISED FILE: dbms/catalogInParse/TableSchema.java
package com.dbms.catalogInParse;

import java.util.Collection;
import java.util.LinkedHashMap; // 1. 导入 LinkedHashMap
import java.util.List;
import java.util.Map;

/**
 * 表示一张表的元数据结构（Schema），包含了表名和其所有列的信息。
 */
public class TableSchema {
    // 表的名称
    private final String tableName;

    // 2. 【核心修改】使用 LinkedHashMap 来存储列信息。
    // 与 HashMap 不同，LinkedHashMap 会记住元素的插入顺序。
    // 这对于确保 `SELECT *` 等操作返回的列顺序与表定义时一致至关重要。
    // Map的键是小写列名，值是Column对象。
    private final Map<String, Column> columns;

    /**
     * TableSchema的构造函数。
     * @param tableName 表名。
     * @param columnList 一个包含此表中所有列的列表。
     */
    public TableSchema(String tableName, List<Column> columnList) {
        this.tableName = tableName;
        // 3. 初始化为一个 LinkedHashMap 实例
        this.columns = new LinkedHashMap<>();
        // 遍历传入的列列表，并将它们逐一放入 LinkedHashMap 中
        for (Column c : columnList) {
            // 将列名转为小写作为键，以支持不区分大小写的列名查找
            this.columns.put(c.getName().toLowerCase(), c);
        }
    }

    /**
     * 获取表名。
     * @return 表名字符串。
     */
    public String getTableName() {
        return tableName;
    }

    /**
     * 根据列名获取单个列的元数据。
     * @param columnName 要查找的列名。
     * @return 如果找到，则返回 Column 对象；否则返回 null。
     */
    public Column getColumn(String columnName) {
        // 使用小写进行查找，实现不区分大小写的匹配
        return columns.get(columnName.toLowerCase());
    }

    /**
     * 【修正】返回一个包含所有列的有序集合 (Collection)。
     * 由于底层使用的是 LinkedHashMap，这个集合中的列顺序将与它们被定义时的顺序相同。
     * @return 一个包含所有 Column 对象的有序集合。
     */
    public Collection<Column> getColumns() {
        return columns.values();
    }

    /**
     * 检查指定的列是否存在于此表中。
     *
     * @param columnName 要检查的列名。
     * @return 如果列存在则返回 true，否则返回 false。
     */
    public boolean hasColumn(String columnName) {
        // 同样使用小写进行查找
        return columns.containsKey(columnName.toLowerCase());
    }
}